/**
 * 文件下载工具函数
 */
import { ElMessage } from 'element-plus'
import request from './request'

/**
 * 下载文件
 * @param {Object} options 下载选项
 * @param {string} options.url 下载URL
 * @param {string} options.method HTTP方法，默认为'get'
 * @param {Object} options.data 请求数据
 * @param {string} options.fileName 文件名
 * @param {Object} options.headers 额外的请求头
 * @returns {Promise<boolean>} 下载是否成功
 */
export const downloadFile = async (options) => {
  const {
    url,
    method = 'get',
    data,
    fileName = `download_${Date.now()}`,
    headers = {}
  } = options

  try {
    // 方法1：使用axios下载
    const response = await request({
      url,
      method,
      data,
      responseType: 'blob',
      timeout: 60000,
      headers: {
        ...headers
      }
    })

    if (response && response.size > 0) {
      // 创建下载链接
      const blob = new Blob([response], { type: 'application/octet-stream' })
      const downloadUrl = window.URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = downloadUrl
      link.download = fileName
      link.style.display = 'none'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      window.URL.revokeObjectURL(downloadUrl)
      
      return true
    }
    
    throw new Error('下载的文件为空')
    
  } catch (error) {
    // 如果是302重定向，尝试使用重定向URL
    if (error.isRedirect && error.redirectUrl) {
      console.log('处理302重定向，使用新URL:', error.redirectUrl)
      try {
        const redirectResponse = await request({
          url: error.redirectUrl,
          method: 'get',
          responseType: 'blob',
          timeout: 60000,
          headers: {
            ...headers
          }
        })

        if (redirectResponse && redirectResponse.size > 0) {
          const blob = new Blob([redirectResponse], { type: 'application/octet-stream' })
          const downloadUrl = window.URL.createObjectURL(blob)
          const link = document.createElement('a')
          link.href = downloadUrl
          link.download = fileName
          link.style.display = 'none'
          document.body.appendChild(link)
          link.click()
          document.body.removeChild(link)
          window.URL.revokeObjectURL(downloadUrl)
          
          return true
        }
      } catch (redirectError) {
        console.error('重定向下载失败:', redirectError)
      }
    }
    
    console.error('axios下载失败:', error)
    throw error
  }
}

/**
 * 使用iframe方式下载文件（适用于需要认证的直接URL下载）
 * @param {string} url 下载URL
 * @param {string} fileName 文件名（可选，主要用于用户提示）
 */
export const downloadByIframe = (url, fileName = '') => {
  try {
    const downloadFrame = document.createElement('iframe')
    downloadFrame.style.display = 'none'
    downloadFrame.src = url
    document.body.appendChild(downloadFrame)
    
    // 延迟移除iframe
    setTimeout(() => {
      if (downloadFrame.parentNode) {
        downloadFrame.parentNode.removeChild(downloadFrame)
      }
    }, 5000)
    
    return true
  } catch (error) {
    console.error('iframe下载失败:', error)
    return false
  }
}

/**
 * 使用新窗口方式下载文件
 * @param {string} url 下载URL
 */
export const downloadByWindow = (url) => {
  try {
    window.open(url, '_blank')
    return true
  } catch (error) {
    console.error('新窗口下载失败:', error)
    return false
  }
}

/**
 * 智能下载函数 - 自动尝试多种下载方式
 * @param {Object} options 下载选项
 * @param {string} options.url 下载URL
 * @param {string} options.method HTTP方法，默认为'post'
 * @param {Object} options.data 请求数据
 * @param {string} options.fileName 文件名
 * @param {string} options.fallbackUrl 备用下载URL（用于iframe/window方式）
 * @returns {Promise<boolean>} 下载是否成功
 */
export const smartDownload = async (options) => {
  const {
    url,
    method = 'post',
    data,
    fileName = `download_${Date.now()}`,
    fallbackUrl
  } = options

  try {
    // 方法1：尝试使用axios blob下载
    try {
      await downloadFile({ url, method, data, fileName })
      ElMessage.success('文件下载成功')
      return true
    } catch (axiosError) {
      console.warn('axios下载失败，尝试其他方式:', axiosError)
    }

    // 方法2：如果有备用URL，尝试iframe下载
    if (fallbackUrl) {
      if (downloadByIframe(fallbackUrl, fileName)) {
        ElMessage.success('已触发文件下载，请检查浏览器下载文件夹')
        return true
      }
    }

    // 方法3：最后尝试新窗口下载
    if (fallbackUrl) {
      if (downloadByWindow(fallbackUrl)) {
        ElMessage.success('已在新窗口打开下载链接')
        return true
      }
    }

    throw new Error('所有下载方式都失败了')

  } catch (error) {
    console.error('智能下载失败:', error)
    
    // 详细的错误处理
    if (error.response) {
      const status = error.response.status
      switch (status) {
        case 302:
          ElMessage.error('下载链接重定向，请检查文件权限或联系管理员')
          break
        case 401:
          ElMessage.error('无权限下载该文件，请重新登录')
          break
        case 404:
          ElMessage.error('文件不存在或已被删除')
          break
        case 403:
          ElMessage.error('没有权限访问该文件')
          break
        case 500:
          ElMessage.error('服务器内部错误，请稍后重试')
          break
        default:
          ElMessage.error(`下载失败 (${status})：${error.response.data?.message || '未知错误'}`)
      }
    } else {
      ElMessage.error('下载文件失败，请检查网络连接')
    }
    
    return false
  }
}

export default {
  downloadFile,
  downloadByIframe,
  downloadByWindow,
  smartDownload
} 